/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Prueba;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import edu.uoc.tds.pec4.common.RemotoInterface;

import java.text.SimpleDateFormat;
import java.util.Date;


/**
 *
 * @author Fernando
 */
public class GestorPrueba {
    RemotoInterface remoto;


    public GestorPrueba(RemotoInterface remoto){
        this.remoto = remoto;
    }

    /**
     * MÃ©todo para obtener una lista de instancias de Prueba
     * {pre: es un mÃ©todo tÃ­pico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public List<Prueba> getListaPruebas(){
	//Establecemos la sentencia para obtener una lista de resultados
        List<Prueba> lista = new ArrayList<Prueba>();

	String sqlString = null;
	sqlString = "SELECT * FROM Prueba ORDER BY id_prueba;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{            
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            resultSet = preparedStatement.executeQuery();
            
            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el mÃ©todo
            while(resultSet.next()){
                Prueba prueba = new Prueba();
                
                prueba.setId_prueba(resultSet.getInt("id_prueba"));
		prueba.setDescripcion_prueba(resultSet.getString("descripcion_prueba"));

                lista.add(prueba);
            }
        }
        
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepciÃ³n de carÃ¡cter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return lista;
    }

    /**
     * MÃ©todo para obtener una lista de instancias de Prueba
     * {pre: es un mÃ©todo tÃ­pico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public Prueba getPrueba(int id_prueba){
        Prueba prueba = new Prueba();

        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "SELECT * FROM Prueba WHERE id_prueba >= ? ORDER BY id_prueba;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, id_prueba);

            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el mÃ©todo
            if(resultSet.next()){
                prueba.setId_prueba(resultSet.getInt("id_prueba"));
		prueba.setDescripcion_prueba(resultSet.getString("descripcion_prueba"));
                prueba.setId_estado_prueba(resultSet.getInt("id_estado_prueba"));
                prueba.setDescripcion_prueba(resultSet.getString("descripcion_prueba"));
                prueba.setNumero_plazas(resultSet.getInt("numero_plazas"));
                prueba.setFecha_inicio_inscripcion(resultSet.getDate("fecha_inicio_inscripcion"));
                prueba.setFecha_fin_inscripcion(resultSet.getDate("fecha_fin_inscripcion"));
                prueba.setFecha_alta(resultSet.getDate("fecha_alta"));
                prueba.setFecha_baja(resultSet.getDate("fecha_baja"));
                prueba.setFecha_modificacion(resultSet.getDate("fecha_modificacion"));
                prueba.setId_responsable_alta(resultSet.getInt("id_responsable_alta"));
            }

            //Si la lista esta vacia lanzaremos nuestra propia excepcion
            /*
            if(lista.isEmpty())
                throw new ListaVaciaException();
             *
             */
        }

        /** Capturamos el error en el caso en que la lista generada este vacÃ­a */
        /*
        catch(ListaVaciaException exc){
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        */
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepción de carácter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return prueba;
    }

    public boolean ValidarPrueba(Prueba prueba){
        boolean esValido = true;
        GestorParametro gestorParametro = new GestorParametro();

        try{
            //ComprobandoNoNulos
            if(prueba.getDescripcion_prueba().isEmpty()){                
                throw new Exception("La Descripcion no puede ser nula");
            }

            if(prueba.getDescripcion_prueba().length()>=50){                
                throw new Exception("La Descripcion no puede medir mas de 50 caracteres");
            }

            if(prueba.getNumero_plazas() == 0){                
                throw new Exception("El Número de Plazas no puede ser nulo");
            }

            if(prueba.getNumero_plazas() > gestorParametro.getNumeroPersonasMaximoPorPrueba()){                
                throw new Exception("El Número de Plazas no puede ser superior a " + gestorParametro.getNumeroPersonasMaximoPorPrueba());
            }

            if(prueba.getNumero_plazas() < gestorParametro.getNumeroPersonasMinimasInscritas()){                
                throw new Exception("El Número de Plazas no puede ser inferior a " + gestorParametro.getNumeroPersonasMinimasInscritas());
            }

            if(prueba.getFecha_inicio_inscripcion()==null){                
                throw new Exception("La Fecha Inicio Inscripción no tiene un formato correcto");
            }

            else {
                try{
                    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
                    String fechaTexto = formatoFecha.format(prueba.getFecha_inicio_inscripcion());
                }

                catch (Exception exc){                    
                    throw new Exception("La Fecha Inicio Inscripción no tiene un formato tipo dd/mm/aaaa");
                }
            }

            if(prueba.getFecha_inicio_inscripcion().compareTo(prueba.getFecha_alta())<0){
                throw new Exception("La Fecha Inicio Inscripción no puede ser anterior a la Fecha de Alta");
            }

            if(prueba.getFecha_fin_inscripcion()==null){                
                throw new Exception("La Fecha Fin Inscripción no tiene un formato adecuado");
            }

            else{
                try{
                    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
                    String fechaTexto = formatoFecha.format(prueba.getFecha_fin_inscripcion());
                }
                
                catch (Exception exc){                   
                    throw new Exception("La Fecha Fin Inscripción no tiene un formato dd/mm/aaaa");
                }
            }

            if(prueba.getFecha_inicio_inscripcion().compareTo(prueba.getFecha_fin_inscripcion())>0){                
                throw new Exception("La Fecha Inicio Inscripción no puede ser posterior a la Fecha de Fin de Inscripción");
            }
        }

        catch(Exception exc){
            JOptionPane.showMessageDialog(null, exc.getMessage() , GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            esValido = false;
        }

        return esValido;
    }

    public void insertarPrueba(Prueba prueba){
        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "INSERT INTO Prueba "
                + "(id_responsable_alta"
                + ",descripcion_prueba"
                + ",numero_plazas"
                + ",id_estado_prueba"
                + ",fecha_inicio_inscripcion"
                + ",fecha_fin_inscripcion"
                + ",fecha_alta)"
                + " VALUES(?,?,?,?,?,?,?);";

        PreparedStatement preparedStatement = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, prueba.getId_responsable_alta());
            preparedStatement.setString(2, prueba.getDescripcion_prueba());
            preparedStatement.setInt(3, prueba.getNumero_plazas());
            preparedStatement.setInt(4, prueba.getId_estado_prueba());
            preparedStatement.setDate(5, new java.sql.Date(prueba.getFecha_inicio_inscripcion().getTime()));
            preparedStatement.setDate(6, new java.sql.Date(prueba.getFecha_fin_inscripcion().getTime()));
            preparedStatement.setDate(7, new java.sql.Date(prueba.getFecha_alta().getTime()));

            preparedStatement.executeUpdate();
        }

        /** Capturamos el error en el caso en que la lista generada este vacÃ­a */
        //catch(ListaVaciaException exc){
        //    JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        //}
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
                preparedStatement.close();
            }

            /** Capturamos excepciÃ³n de carÃ¡cter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }
    }
}
